#[derive(Debug, Clone, PartialEq)]
pub enum TokenType {
    // 关键字
    /// 篇章
    Chapter,
    /// 引言
    Intro,
    /// 正文
    Body,
    /// 结语
    Conclusion,
    /// 结束
    End,
    /// 有
    Have,
    /// 为
    Const,
    /// 是
    Is,
    /// 物
    Thing,
    /// 说
    Say,
    /// 用
    Use,
    /// 返回
    Return,
    DefaultIf,
    At,
    And,
    With,
    ClassOf,
    IsA,
    Its,
    Parent,
    Of,
    SetValue,
    If,
    Then,
    Else,
    While,
    WhenTime,
    Do,
    Until,
    From,
    To,
    Step,
    Loop,
    ForEach,
    Break,
    Continue,
    Try,
    Catch,
    Throw,
    Finally,
    Import,
    Export,

    // 运算符
    Add,
    Sub,
    Mul,
    Div,
    Mod,
    FloorDiv,
    Gt,
    Lt,
    Eq,
    Ne,
    Ge,
    Le,
    LogicAnd,
    LogicOr,
    LogicNot,

    // 字面量
    Integer(i64),
    Float(f64),
    String(String),
    StringWithInterpolation(String),
    True,
    False,
    Null,

    // 集合
    List,
    Dict,
    DictStart, // 《 字典开始标记
    Set,
    Tuple,

    // 标识符
    Identifier(String),

    // 分隔符
    /// 顿号
    Comma,
    /// 句号
    Period,
    /// 冒号
    Colon,
    /// 指 - 关键字参数指定
    Specify,
    /// 左括号
    LeftParen,
    /// 右括号  
    RightParen,
    /// 左方括号 - 列表字面量开始
    LeftBracket,
    /// 右方括号 - 列表字面量结束
    RightBracket,

    // 特殊
    Newline,
    EOF,
}

impl TokenType {
    /// 将 TokenType 转换为中文关键字
    pub fn to_chinese(&self) -> String {
        match self {
            // 关键字
            &TokenType::Chapter => "篇章".to_string(),
            &TokenType::Intro => "引言".to_string(),
            &TokenType::Body => "正文".to_string(),
            &TokenType::Conclusion => "结语".to_string(),
            &TokenType::End => "毕".to_string(),
            &TokenType::Have => "有".to_string(),
            &TokenType::Const => "为".to_string(),
            &TokenType::Is => "是".to_string(),
            &TokenType::Thing => "物".to_string(),
            &TokenType::Say => "说".to_string(),
            &TokenType::Use => "用".to_string(),
            &TokenType::Return => "返回".to_string(),
            &TokenType::DefaultIf => "缺则".to_string(),
            &TokenType::Specify => "指".to_string(),
            &TokenType::At => "于".to_string(),
            &TokenType::And => "与".to_string(),
            &TokenType::With => "伴".to_string(),
            &TokenType::ClassOf => "类".to_string(),
            &TokenType::IsA => "是".to_string(),
            &TokenType::Its => "其".to_string(),
            &TokenType::Parent => "父".to_string(),
            &TokenType::Of => "之".to_string(),
            &TokenType::SetValue => "设".to_string(),
            &TokenType::If => "若".to_string(),
            &TokenType::Then => "则".to_string(),
            &TokenType::Else => "否则".to_string(),
            &TokenType::While => "当".to_string(),
            &TokenType::WhenTime => "之时".to_string(),
            &TokenType::Do => "做".to_string(),
            &TokenType::Until => "直到".to_string(),
            &TokenType::From => "从".to_string(),
            &TokenType::To => "到".to_string(),
            &TokenType::Step => "步".to_string(),
            &TokenType::Loop => "循环".to_string(),
            &TokenType::ForEach => "遍历".to_string(),
            &TokenType::Break => "断".to_string(),
            &TokenType::Continue => "续".to_string(),
            &TokenType::Try => "试".to_string(),
            &TokenType::Catch => "捕".to_string(),
            &TokenType::Throw => "抛".to_string(),
            &TokenType::Finally => "终".to_string(),
            &TokenType::Import => "引入".to_string(),
            &TokenType::Export => "导出".to_string(),

            // 运算符
            &TokenType::Add => "加".to_string(),
            &TokenType::Sub => "减".to_string(),
            &TokenType::Mul => "乘".to_string(),
            &TokenType::Div => "除".to_string(),
            &TokenType::Mod => "模".to_string(),
            &TokenType::FloorDiv => "整除".to_string(),
            &TokenType::Gt => "大于".to_string(),
            &TokenType::Lt => "小于".to_string(),
            &TokenType::Eq => "等于".to_string(),
            &TokenType::Ne => "不等于".to_string(),
            &TokenType::Ge => "大于等于".to_string(),
            &TokenType::Le => "小于等于".to_string(),
            &TokenType::LogicAnd => "并且".to_string(),
            &TokenType::LogicOr => "或者".to_string(),
            &TokenType::LogicNot => "非".to_string(),

            // 字面量
            &TokenType::Integer(_) => "整数".to_string(),
            &TokenType::Float(_) => "浮点数".to_string(),
            &TokenType::String(_) => "字符串".to_string(),
            &TokenType::StringWithInterpolation(_) => "字符串插值".to_string(),
            &TokenType::True => "真".to_string(),
            &TokenType::False => "假".to_string(),
            &TokenType::Null => "空".to_string(),

            // 集合
            &TokenType::List => "列表".to_string(),
            &TokenType::Dict => "字典".to_string(),
            &TokenType::Set => "集合".to_string(),
            &TokenType::Tuple => "元组".to_string(),
            &TokenType::DictStart => "字典开始".to_string(),

            // 标识符
            &TokenType::Identifier(_) => "标识符".to_string(),

            // 分隔符
            &TokenType::Comma => "逗号".to_string(),
            &TokenType::Period => "句号".to_string(),
            &TokenType::Colon => "冒号".to_string(),
            &TokenType::LeftParen => "左括号".to_string(),
            &TokenType::RightParen => "右括号".to_string(),
            &TokenType::LeftBracket => "左方括号".to_string(),
            &TokenType::RightBracket => "右方括号".to_string(),

            // 特殊
            &TokenType::Newline => "换行".to_string(),
            &TokenType::EOF => "文件结束".to_string(),
        }
    }
}
